package com.hong.record.common.util;

import java.lang.reflect.Field;

/**
 * @author hongji
 * @date 2019-12-06
 */
public class CompareObejctUtil {
    /**
     * 复制对象属性（对象类型必须相同）
     *
     * @param orig 资源对象
     * @param dest 目标对象
     * @param clazz 源对象类
     * @param ignoreNull 是否忽略空（true:忽略，false：不忽略）
     * @param ignoreExist  是否只复制dest值为空的数据  true 是，false 否
     * @return
     */
    public static <T> T copyProperties(T orig, T dest, Class<?> clazz, boolean ignoreNull,boolean ignoreExist) {
        if (orig == null || dest == null){
            return null;
        }
        if(!clazz.isAssignableFrom(orig.getClass())){
            return null;
        }
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            try {
                field.setAccessible(true);
                Object value = field.get(orig);
                Object value2 = field.get(dest);
                System.out.println(field + "----" + value2);
                if(!java.lang.reflect.Modifier.isFinal(field.getModifiers())){
                    if(!(ignoreNull && value == null)){
                        if(ignoreExist && value2 != null){

                        }else{
                            field.set(dest, value);
                        }
                    }
                }
                field.setAccessible(false);
            } catch (Exception e) {
            }
        }
        if(clazz.getSuperclass() == Object.class){
            return dest;
        }
        return copyProperties(orig, dest, clazz.getSuperclass(), ignoreNull,ignoreExist);
    }

    /**
     * 调用示例
     * * 记录修改数据的日志
     * * @Param
     * * Class<T> c 修改对应的实体类
     * * T old 修改前的数据
     * * T update 修改的值（通过JSON转换为bean）
     * * @rerturn 返回经过更新后的数据
     */
    /*public <T> T saveUpdateLog(Class<T> c, T old, T update) {
        try {
            TUpdateLog updateLog = new TUpdateLog();
            CompareObejct<T> compareObejct = new CompareObejct<T>();
            compareObejct.setOriginal(old);
            compareObejct.setCurrent(update);
            String updateContrast = compareObejct.contrastObj(c);
            if (!JiuyiUtil.isEmpty(updateContrast)) {
                updateLog.setUpdateContrast(updateContrast);
                //通过注解获取tableName
                Table annotation = c.getAnnotation(Table.class);
                String tableName = annotation.name();
                updateLog.setTableName(tableName);
                updateLog.setBeforeUpdateEntity(JSON.toJSONString(old));
                JiuyiUtil.copyProperties(old, update, false, true);
                updateLog.setAfterUpdateEntity(JSON.toJSONString(update));
                updateLogDao.save(updateLog);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return update;
    }*/
}
